package com.yunke.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yunke.dto.YunkeDistributorApplyDto;
import com.yunke.dto.YunkeDistributorWithdrawDto;
import com.yunke.entity.YunkeDistributor;
import com.yunke.entity.YunkeDistributorCommission;
import com.yunke.entity.YunkeDistributorWithdraw;
import com.yunke.vo.YunkeDistributorCommissionVo;
import com.yunke.vo.YunkeDistributorVo;
import com.yunke.vo.YunkeDistributorWithdrawVo;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 分销体系服务接口
 *
 * @author yunke
 * @since 1.0.0
 */
public interface YunkeDistributorService {

    /**
     * 申请成为分销商
     *
     * @param userId 用户ID
     * @param applyDto 申请信息
     * @return 申请结果
     */
    boolean applyDistributor(Long userId, YunkeDistributorApplyDto applyDto);

    /**
     * 获取分销商信息
     *
     * @param userId 用户ID
     * @return 分销商信息
     */
    YunkeDistributorVo getDistributorInfo(Long userId);

    /**
     * 分页查询分销商列表
     *
     * @param current 当前页
     * @param size 页大小
     * @param nickname 昵称
     * @param mobile 手机号
     * @param level 等级
     * @param auditStatus 审核状态
     * @param distributorStatus 分销商状态
     * @return 分销商列表
     */
    IPage<YunkeDistributorVo> getDistributorPage(Integer current, Integer size, String nickname, 
                                                  String mobile, Integer level, Integer auditStatus, 
                                                  Integer distributorStatus);

    /**
     * 审核分销商申请
     *
     * @param distributorId 分销商ID
     * @param auditStatus 审核状态
     * @param auditRemark 审核意见
     * @param auditorId 审核人ID
     * @return 审核结果
     */
    boolean auditDistributor(Long distributorId, Integer auditStatus, String auditRemark, Long auditorId);

    /**
     * 更新分销商状态
     *
     * @param distributorId 分销商ID
     * @param distributorStatus 状态
     * @return 更新结果
     */
    boolean updateDistributorStatus(Long distributorId, Integer distributorStatus);

    /**
     * 获取分销商团队列表
     *
     * @param distributorId 分销商ID
     * @param level 团队等级
     * @return 团队列表
     */
    List<YunkeDistributorVo> getTeamList(Long distributorId, Integer level);

    /**
     * 生成推广链接
     *
     * @param distributorId 分销商ID
     * @return 推广链接
     */
    String generatePromoteUrl(Long distributorId);

    /**
     * 生成推广二维码
     *
     * @param distributorId 分销商ID
     * @return 二维码图片地址
     */
    String generatePromoteQrcode(Long distributorId);

    /**
     * 记录分销佣金
     *
     * @param distributorUserId 分销商用户ID
     * @param orderId 订单ID
     * @param orderNo 订单号
     * @param customerUserId 客户用户ID
     * @param commissionType 佣金类型
     * @param orderAmount 订单金额
     * @return 记录结果
     */
    boolean recordCommission(Long distributorUserId, Long orderId, String orderNo, 
                           Long customerUserId, Integer commissionType, BigDecimal orderAmount);

    /**
     * 分页查询佣金记录
     *
     * @param distributorId 分销商ID
     * @param current 当前页
     * @param size 页大小
     * @param commissionType 佣金类型
     * @param commissionStatus 佣金状态
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 佣金记录列表
     */
    IPage<YunkeDistributorCommissionVo> getCommissionPage(Long distributorId, Integer current, Integer size,
                                                           Integer commissionType, Integer commissionStatus,
                                                           Long startTime, Long endTime);

    /**
     * 获取佣金统计
     *
     * @param distributorId 分销商ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 佣金统计
     */
    Map<String, Object> getCommissionStats(Long distributorId, Long startTime, Long endTime);

    /**
     * 申请提现
     *
     * @param distributorId 分销商ID
     * @param withdrawDto 提现信息
     * @return 申请结果
     */
    boolean applyWithdraw(Long distributorId, YunkeDistributorWithdrawDto withdrawDto);

    /**
     * 分页查询提现记录
     *
     * @param distributorId 分销商ID
     * @param current 当前页
     * @param size 页大小
     * @param withdrawStatus 提现状态
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 提现记录列表
     */
    IPage<YunkeDistributorWithdrawVo> getWithdrawPage(Long distributorId, Integer current, Integer size,
                                                       Integer withdrawStatus, Long startTime, Long endTime);

    /**
     * 审核提现申请
     *
     * @param withdrawId 提现ID
     * @param auditStatus 审核状态
     * @param auditRemark 审核意见
     * @param auditorId 审核人ID
     * @return 审核结果
     */
    boolean auditWithdraw(Long withdrawId, Integer auditStatus, String auditRemark, Long auditorId);

    /**
     * 处理提现
     *
     * @param withdrawId 提现ID
     * @param processorId 处理人ID
     * @return 处理结果
     */
    boolean processWithdraw(Long withdrawId, Long processorId);

    /**
     * 获取分销配置
     *
     * @param configKey 配置键
     * @return 配置值
     */
    String getDistributorConfig(String configKey);

    /**
     * 更新分销配置
     *
     * @param configKey 配置键
     * @param configValue 配置值
     * @return 更新结果
     */
    boolean updateDistributorConfig(String configKey, String configValue);

    /**
     * 检查用户是否可以申请分销商
     *
     * @param userId 用户ID
     * @return 检查结果
     */
    boolean checkCanApply(Long userId);

    /**
     * 通过邀请码绑定上级分销商
     *
     * @param userId 用户ID
     * @param inviteCode 邀请码
     * @return 绑定结果
     */
    boolean bindParentDistributor(Long userId, String inviteCode);

    /**
     * 结算佣金
     *
     * @param distributorId 分销商ID
     * @param commissionIds 佣金ID列表
     * @return 结算结果
     */
    boolean settleCommissions(Long distributorId, List<Long> commissionIds);

    /**
     * 获取分销商数据概览
     *
     * @param distributorId 分销商ID
     * @return 数据概览
     */
    Map<String, Object> getDistributorOverview(Long distributorId);
} 